//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Algorithm
// 文件名   : UnmodifiedSequenceAlgorithm.h
// 作者     : Aiye
// 日期     : 2025/9/9 02:56
// 邮箱     : 2878548868@qq.com
// 摘要     : 非序列修改算法
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef ALGORITHM_UNMODIFIEDSEQUENCEALGORITHM_H
#define ALGORITHM_UNMODIFIEDSEQUENCEALGORITHM_H
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <vector>


class UnModifiedSequenceAlgorithm
{
public:
    /**
     * @brief 查找算法
     */
    static void Find()
    {
        std::vector<int> nVec{1,2,3,5,7,6,8,9,54,56,1,2,5,23,67,2};
        std::set<int> nSet{nVec.begin() , nVec.end()}; // 去除重复
        std::map<int , std::string> nstrMap{{1 , "one"} , {2 , "two"} , {3 , "three"},
                                        {4 , "four"} , {5 , "five"} , {5 , "six"}};
        { // 顺序容器查找特定元素

            auto print = [&nVec](auto it)
            {
                if (it != nVec.end())
                {
                    std::cout << "Find:" << *it << std::endl;
                }
            };

            auto itVec = std::find(nVec.begin() , nVec.end() , 3);
            print(itVec);

            itVec = std::find_if(nVec.begin() , nVec.end() , [](int nVar)
            {
                return nVar > 5; // 查找第一个大于5的数字
            }); // 一元谓词，只接受一个参数，并返回bool
            print(itVec);

            itVec = std::find_if(nVec.begin() , nVec.end() , [](decltype(nVec)::value_type nVar)
            {
                return nVar % 2 == 0; // 查找第一个偶数
            });
            print(itVec);

            auto nCount = std::count(nVec.begin() , nVec.end() , 5); // 统计5出现的次数
            std::cout << "Number of 5 :" << nCount << std::endl;

            nCount = std::count_if(nVec.begin() , nVec.end(), [](decltype(nVec)::value_type var)
            {
                return var > 5; // 统计大于5的数量
            }); // 一元谓词
            std::cout << "Number of >5 :" << nCount << std::endl;

            std::vector<int> nSub{3,5,7}; //创建一个子串
            itVec = std::search(nVec.begin() , nVec.end() , nSub.begin() , nVec.end());
            print(itVec);

            // 二分查找法，需要先排好序
            std::sort(nVec.begin() , nVec.end());
            bool bFound = std::binary_search(nVec.begin() , nVec.end() , 7);

            // 上面的算法都可以用ranges里面的算法
            auto bResulr = std::ranges::binary_search(nVec ,7); // 直接传容器
            auto n = std::ranges::sort(nVec);

            std::cout << "------------------" << std::endl;
        }

        { // set容器查找
            auto it = nSet.find(7); // set有自己的find方法，且效率更高
            auto nCount = nSet.count(5); // 自己count方法
            // 剩下的用法几乎一致

            std::cout << "------------------" << std::endl;
        }

        { // map容器查咋
            auto it  = nstrMap.find(2); // 按键查找
            if (it != nstrMap.end())
            {
                std::cout << "Found 2: " << it->second << std::endl;
            }

            it = std::ranges::find_if(nstrMap , [](const decltype(nstrMap)::value_type& p)
            {
                return p.first > 3 ;
            }); // 查咋第一个键大于3
            std::cout << "Key:" << it->first << " Value:" << it->second << std::endl;
            // 二分查找则需要将键或者值提取到另一个容器

            std::cout << "------------------" << std::endl;
        }
    }

    /**
     * @brief 介绍比较算法k
     */
    static void Compare()
    {
        {
            std::vector<int> nVec1{1,2,3,4,5,6,7};
            std::vector<int> nVec2{1,2,3,4,5,6,7};
            std::vector<int> nVec3{1,2,3,4,6,7,8};

            bool bEqual = std::equal(nVec1.begin() , nVec1.end() , nVec2.begin());
            std::cout << "Equal:" << std::boolalpha << bEqual << std::endl;

            // 使用自定义比较函数
            bEqual = std::ranges::equal(nVec2 , nVec3 , [](auto Var1 , auto Var2)
            {
                return std::abs(Var1 - Var2) <= 1;
            }); // 二元谓词
            std::cout << "Almost equal: " << std::boolalpha << bEqual << std::endl;

            // 查找第一个不匹配的元素对
            auto mismatchPair = std::mismatch(nVec1.begin() , nVec1.end() , nVec3.begin());
            if (mismatchPair.first != nVec1.end())
            {
                std::cout << "First mismatch at poisition:"
                    << std::distance(nVec1.begin() , mismatchPair.first)
                    << " Value" << *mismatchPair.first << *mismatchPair.second << std::endl;
            }

            // 自定义比较函数
            mismatchPair = std::mismatch(nVec1.begin() , nVec1.end() ,nVec3.begin() ,
                                         [](auto var1 , auto var2)
                                         {
                                             return std::abs(var1 - var2) <= 1;
                                         });
            if (mismatchPair.first != nVec1.end())
            {
                std::cout << "First mismatch at poisition:"
                    << std::distance(nVec1.begin() , mismatchPair.first)
                    << " Value" << *mismatchPair.first << *mismatchPair.second << std::endl;
            }
        }

        { // 其他比较函数
            std::vector<int> nVec1 = {2, 4, 6, 8, 10}; // 全是偶数
            std::vector<int> nVec2 = {1, 3, 5, 7, 8};  // 有一个偶数
            std::vector<int> nVec3 = {1, 3, 5, 7, 9};  // 没有偶数

            // 全部满足条件
            auto bAllEven = std::all_of(nVec1.begin() , nVec1.end() ,
                [](decltype(nVec1)::value_type var)
                {
                   return var % 2 == 0;
                }); //检查所有元素是否为偶数
            std::cout << "All even in nVec1 " << std::boolalpha << bAllEven << std::endl;

            // 至少有一个满足条件
            auto bAnyEven = std::ranges::any_of(nVec2 , [](decltype(nVec2)::value_type var)
            {
               return  var % 2 == 0;
            }); // 至少有一个为偶数
            std::cout << "Any even in nVec2 " << std::boolalpha << bAnyEven << std::endl;

            // 全部不满足条件
            auto bNoneEven = std::ranges::none_of(nVec3 , [](decltype(nVec3)::value_type var)
            {
               return var % 2 == 0;
            }); // 全部部位偶数
            std::cout << "None enev in nVec3 " << std::boolalpha << bNoneEven << std::endl;
        }

    }
};

#endif //ALGORITHM_UNMODIFIEDSEQUENCEALGORITHM_H